<?php
class Usu_x_GrupoDAO extends GenericDAO  {
	private $contexto;
	
	function __construct() {
		$this->tabela["alteracao"] = array(	"id" 	=> 46,
											"nome" 	=> strtolower(substr(get_class(), 0, -3)));
	
		$this->tabela["consulta"]  = array(	"id" 	=> 49,
											"nome" 	=> "vw_" . strtolower(substr(get_class(), 0, -3)));
		$this->contexto = true;
	}
	
	public function limitarContexto($limitar) {
		$this->contexto = $limitar;
	}
	
	private function sqlContexto() {
		return ' exists (select grupo from usu_x_grupo where usuario = :usuario and ehSubGrupo(usu_x_grupo.grupo, vw_usu_x_grupo.grupoid))';
	}
	
	public function inserir($registro, $finalizarTransacao = true) {
		$reg['usuario'] = $registro['usuario'];
		$reg['grupo'] = $registro['grupo'];
		$id = $this->inserirRegistro($reg, $finalizarTransacao);
		return (!is_null($id)) ? $reg : null;
	}
	
	public function excluir($pk, $finalizarTransacao = true) {
		return $this->excluirRegistro($pk, $finalizarTransacao);		
	}
	
	public function excluirUsuario($usuario, $finalizarTransacao = true) {
		$sql = "delete from usu_x_grupo where usuario = :usuario";
		$params['usuario'] = $usuario;
		return $this->execSQL($sql, $params, $finalizarTransacao);
	}
	
	public function excluirGrupo($grupo, $finalizarTransacao = true) {
		$sql = "delete from usu_x_grupo where grupo = :grupo";
		$params['grupo'] = $grupo;
		return $this->execSQL($sql, $params, $finalizarTransacao);
	}
	
	public function consultarPK($pk) {
		$sql = " where usuarioid = :usuarioid and grupoid = :grupoid";
	    
		// contexto
	    if ($this->contexto) {
	    	$sql .= " and " . $this->sqlContexto();
	    	$pk['usuario'] = $_SESSION['usuario']['id'];
	    }
	    // fim contexto
		
	    return $this->consultar($sql, $pk);
	}

	public function consultarUsuarios($grupo = 0) {
		$campo = is_numeric($grupo) ? "id" : "";
	    $where = " where grupo$campo = :grupo";
	    $params['grupo'] = $grupo;
	    
	    // contexto
	    if ($this->contexto) {
	    	$where .= " and " . $this->sqlContexto();
	    	$params['usuario'] = $_SESSION['usuario']['id'];
	    }
	    // fim contexto
	    
	    return $this->consultar($where, $params);
	}

	public function consultarUsuariosDisponiveis($grupo = 0, $usuario = '') {
		$campo = is_numeric($grupo) ? "id" : "";
		$params['usuario'] = "%$usuario%";
		$params['grupo'] = $grupo;
		$dao = new UsuarioDAO();
	    $sql = " where id not in (select usuarioid from vw_usu_x_grupo where grupo$campo = :grupo) and usuario like :usuario";
		
	    return $dao->consultar($sql, $params);
	}

	public function consultarGrupos($usuario = 0) {
		$campo = is_numeric($usuario) ? "id" : "";
	    $sql = " where usuario$campo = :usu" ;
	    $params['usu'] = $usuario;
	    
	    // contexto
	    if ($this->contexto) {
	    	$sql .= " and " . $this->sqlContexto();
	    	$params['usuario'] = $_SESSION['usuario']['id'];
	    }
	    // fim contexto
	    
	    return $this->consultar($sql, $params);
	}

	public function consultarGruposDisponiveis($usuario = 0, $grupo = 0) {
		$campo = is_numeric($usuario) ? "id" : "";
		$cond_grupo = is_numeric($grupo) ? "id =" : "grupo like";
		$params['grupo'] = is_numeric($grupo) ? $grupo : "%$grupo%";
		$params['usu'] 	 = $usuario;
		$dao = new GrupoUsuariosDAO();
		$sql = 	" where id not in (select t1.id 							" .
				"  					 from vw_grupousuarios t1, 				" . 
				"						  vw_usu_x_grupo t2 				" .
				"					where (t1.id = t2.grupoid 				" .
				"					   or ehSubGrupo(t2.grupoid, t1.id))	" . 
				"					  and t2.usuario$campo = :usu) 			" .
				"	and $cond_grupo :grupo									" ;
		return $dao->consultar($sql, $params);
	}
}
?>